package com.zxmzy.scaffold.core.decoration

import android.content.Context
import android.graphics.Canvas
import android.graphics.Rect
import android.graphics.drawable.Drawable
import android.widget.LinearLayout
import androidx.recyclerview.widget.RecyclerView
import com.zxmzy.scaffold.core.utils.LogUtil
import kotlin.math.roundToInt

/**
 * @author zhangxiaoming
 * @date 2023/7/27
 * @description
 */
class CustomDividerItemDecoration(context: Context, orientation: Int) : RecyclerView.ItemDecoration() {
    var drawable: Drawable?
        private set
    private var mDrawLastPositionDivider = true
    private var mOrientation = 0
    private val mBounds = Rect()
    fun setOrientation(orientation: Int) {
        require(!(orientation != HORIZONTAL && orientation != VERTICAL)) {
            "Invalid orientation. It should be either HORIZONTAL or VERTICAL"
        }
        mOrientation = orientation
    }

    fun setDrawable(drawable: Drawable?) {
        requireNotNull(drawable) { "Drawable cannot be null." }
        this.drawable = drawable
    }

    fun isDrawLastPositionDivider(isDraw: Boolean) {
        mDrawLastPositionDivider = isDraw
    }

    override fun onDraw(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        if (parent.layoutManager == null || drawable == null) return
        if (mOrientation == VERTICAL) {
            drawVertical(canvas, parent, state)
        } else {
            drawHorizontal(canvas, parent, state)
        }
    }

    private fun drawHorizontal(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        canvas.save()
        val top:Int
        val bottom:Int
        if(parent.clipToPadding){
            top = parent.paddingTop
            bottom = parent.height-parent.paddingBottom
            canvas.clipRect(parent.paddingLeft,top,parent.width-parent.paddingRight,bottom)
        }else{
            top =0
            bottom = parent.height
        }
        val childCount = parent.childCount
        val lastPosition = state.itemCount-1
        for(i in 0 until childCount){
            val child = parent.getChildAt(i)
            val childRealPosition = parent.getChildAdapterPosition(child)
            if(mDrawLastPositionDivider||childRealPosition<lastPosition){
                parent.layoutManager!!.getDecoratedBoundsWithMargins(child,mBounds)
                val right = mBounds.right+ child.translationX.roundToInt()
                val left = right-drawable!!.intrinsicWidth
                drawable!!.setBounds(left,top,right,bottom)
                drawable!!.draw(canvas)
            }
        }
        canvas.restore()
    }

    private fun drawVertical(canvas: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        canvas.save()
        val left: Int
        val right: Int
        if (parent.clipToPadding) {
            left = parent.paddingLeft
            right = parent.width - parent.paddingRight
            canvas.clipRect(left, parent.paddingTop, right, parent.height - parent.paddingBottom)
        } else {
            left = 0
            right = parent.width
        }
        val childCount = parent.childCount
        val lastPosition = state.itemCount - 1
        for (i in 0 until childCount) {
            val child = parent.getChildAt(i)
            val childRealPosition = parent.getChildAdapterPosition(child)
            if (mDrawLastPositionDivider || childRealPosition < lastPosition) {
                parent.getDecoratedBoundsWithMargins(child, mBounds)
                val bottom = mBounds.bottom + child.translationY.roundToInt()
                val top = bottom - drawable!!.intrinsicHeight
                drawable!!.setBounds(left, top, right, bottom)
                drawable!!.draw(canvas)
            }
        }
        canvas.restore()
    }


    companion object {
        const val HORIZONTAL = LinearLayout.HORIZONTAL
        const val VERTICAL = LinearLayout.VERTICAL
        private const val TAG = "DividerItem"
        private val ATTRS = intArrayOf(android.R.attr.listDivider)
    }

    init {
        val a = context.obtainStyledAttributes(ATTRS)
        drawable = a.getDrawable(0)
        if (drawable == null) {
            LogUtil.w(
                TAG, "@android:attr/listDivider was not set in the theme used for this "
                        + "DividerItemDecoration. Please set that attribute all call setDrawable()"
            )
        }
        a.recycle()
        setOrientation(orientation)
    }
}